package com.mail.server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import com.mail.tool.Conf;
import com.mail.tool.LOG;
import com.mail.tool.Pack;
import com.mail.tool.Util;

public class SocketServer extends Thread {
	private ServerSocket serverSocket;
	private ExecutorService executorService;// 线程池
	private final int POOL_SIZE = 10;// 单个CPU线程池大小

	public SocketServer() throws IOException {
		serverSocket = new ServerSocket(Integer.valueOf(Conf.port));
		// Runtime的availableProcessor()方法返回当前系统的CPU数目.
		executorService = Executors.newFixedThreadPool(Runtime.getRuntime()
				.availableProcessors()
				* POOL_SIZE);
		LOG.out("server start... port " + Conf.port);
	}

	public void run() {
		service();
	}

	public void service() {
		while (true) {
			Socket socket = null;
			try {
				// 接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接
				socket = serverSocket.accept();
				executorService.execute(new Handler(socket));

			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args) throws IOException {
		new Conf();

	}

}

class Handler implements Runnable {
	private Socket socket;

	public Handler(Socket socket) {
		this.socket = socket;
	}

	private PrintWriter getWriter(Socket socket) throws IOException {
		OutputStream socketOut = socket.getOutputStream();
		return new PrintWriter(socketOut, true);
	}

	private BufferedReader getReader(Socket socket) throws IOException {
		InputStream socketIn = socket.getInputStream();
		return new BufferedReader(new InputStreamReader(socketIn));
	}

	public String echo(String msg) {
		return "echo:" + msg;
	}

	public void run() {
		try {
			LOG.out("New connection accepted " + socket.getInetAddress() + ":"
					+ socket.getPort());
			while (true) {
				InputStream is = socket.getInputStream();
				byte[] tmp = new byte[4];
				is.read(tmp);
				System.out.println("length:["+new String(tmp)+"]");
				if (new String(tmp) != null && !new String(tmp).equals("")) {
					int length = Integer.parseInt(new String(tmp));
					tmp = new byte[length];
					is.read(tmp);
					LOG.out(new String(tmp));
					OutputStream os = socket.getOutputStream();
					try {
						os.write(new Pack().unPack(tmp));
						LOG.out("send pack ...");
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
						LOG.out("unPack error");
						String ss = new String(tmp);
						ss = ss + "FF";
						ss = Util.left_(ss.getBytes("GBK").length + "", "0", 4)
								+ ss;
						os.write(ss.getBytes("GBK"));
					}
					os.flush();
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
			LOG.out(e.getMessage());
		} finally {
			try {
				if (socket != null)
					socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}
